Completed
Push — master ( d83c14...87c801 )
by Jan
16s queued 16s
created

write.ts ➔ write   A

Complexity

Conditions 4

Size

Total Lines 5
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 14
dl 0
loc 5
rs 9.7
c 0
b 0
f 0
1
import * as fs from "fs"
2
import { WriteTags } from "../types/Tags"
3
import { create }  from "./create"
4
import { removeTagsFromBuffer } from "./remove"
5
import { isFunction, isString } from "../util"
6
7
export type WriteCallback = {
8
    (error: null, data: Buffer): void
9
    (error: NodeJS.ErrnoException | Error, data: null): void
10
}
11
12
/**
13
 * Write passed tags to a file/buffer
14
 */
15
export function write(tags: WriteTags, buffer: Buffer): Buffer
16
export function write(tags: WriteTags, filepath: string): true | Error
17
export function write(
18
    tags: WriteTags, filebuffer: string | Buffer, callback: WriteCallback
19
): void
20
export function write(
21
    tags: WriteTags,
22
    filebuffer: string | Buffer,
23
    callback?: WriteCallback
24
): Buffer | true | Error | void {
25
    const tagsBuffer = create(tags)
26
27
    if (isFunction(callback)) {
28
        if (isString(filebuffer)) {
29
            return writeAsync(tagsBuffer, filebuffer, callback)
30
        }
31
        return callback(null, writeInBuffer(tagsBuffer, filebuffer))
32
    }
33
    if (isString(filebuffer)) {
34
        return writeSync(tagsBuffer, filebuffer)
35
    }
36
    return writeInBuffer(tagsBuffer, filebuffer)
37
}
38
39
function writeInBuffer(tags: Buffer, buffer: Buffer) {
40
    buffer = removeTagsFromBuffer(buffer) || buffer
41
    return Buffer.concat([tags, buffer])
42
}
43
44
function writeAsync(tags: Buffer, filepath: string, callback: WriteCallback) {
45
    fs.readFile(filepath, (error, data) => {
46
        if (error) {
47
            callback(error, null)
48
            return
49
        }
50
        const newData = writeInBuffer(tags, data)
51
        fs.writeFile(filepath, newData, 'binary', (error) => {
52
            if (error) {
53
                callback(error, null)
54
            } else {
55
                callback(null, newData)
56
            }
57
        })
58
    })
59
}
60
61
function writeSync(tags: Buffer, filepath: string) {
62
    try {
63
        const data = fs.readFileSync(filepath)
64
        const newData = writeInBuffer(tags, data)
65
        fs.writeFileSync(filepath, newData, 'binary')
66
        return true
67
    } catch(error) {
68
        return error as Error
69
    }
70
}
71